/**
 * 左孩子右兄弟
 * https://www.lanqiao.cn/problems/1451/learning/?page=1&first_category_id=1&second_category_id=3&tag_relation=intersection&tags=2021,%E7%9C%81%E8%B5%9B
 */

import java.util.ArrayList;
import java.util.Scanner;

/**
 将一个多叉树 转换为 二叉树的话，根据这个左孩子右兄弟的说法，在左子放的是子节点，而右节点是这个孩子节点的兄弟节点
 比如示例1来说的话：
 1 (左孩子为3)
 3 (右兄弟为 4)
 4 (右兄弟为 2)
 2 (左孩子为5)
 5 (这样最高的高度就是4)
 这里问的是 二叉树并且根据题意可以知道类似求最长路径，可以使用深度优先搜索dfs算法
 即找节点的孩子，再继续找该孩子的孩子，直到没有再回退
 可以使用一个ArrayList数组来存储每个节点及其孩子 类似一个邻接表的值
 */
public class Main13 {
    static int ret = 0; // 返回最高的高度
    static ArrayList<Integer>[] lists; // 这里存储的是节点及其对应的孩子节点，类似于一个邻接表
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        lists = new ArrayList[n + 1];
        // 初始化 (相当于填充进每个节点，数组下标即为该节点编号)
        for(int i = 1;i <= n;i++) {
            lists[i] = new ArrayList<>();
        }
        // 构建邻接表，将每个节点的孩子节点放到对应的 ArrayList 中
        for(int i = 2;i <= n;i++) {
            int node = scan.nextInt();
            lists[node].add(i);
        }

        // 从节点1（即根节点）开始dfs即可访问全部，因为这是一棵树
        dfs(0,1);
        System.out.println(ret);
        scan.close();
    }

    public static void dfs(int total,int father) {
        // 获取当前节点的孩子数
        int size = lists[father].size();
        // 如果没有孩子节点，就直接返回
        if(size == 0) {
            ret = Math.max(ret,total);
            return;
        }
        // 对该节点的孩子依次进行dfs
        for(int x : lists[father]) {
            dfs(total + size,x);
        }
    }

}
